winsafe\dshow\com_interfaces/
ipin.rs1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::co;
4use crate::decl::*;
5use crate::dshow::vts::*;
6use crate::kernel::privs::*;
7use crate::ole::privs::*;
8use crate::prelude::*;
9
10com_interface! { IPin: "56a86891-0ad4-11ce-b03a-0020af0ba770";
11 }
18
19impl dshow_IPin for IPin {}
20
21pub trait dshow_IPin: ole_IUnknown {
24 fn_com_noparm! { BeginFlush: IPinVT;
25 }
28
29 fn Connect(&self, receive_pin: &impl dshow_IPin, mt: Option<&AM_MEDIA_TYPE>) -> HrResult<()> {
32 ok_to_hrresult(unsafe {
33 (vt::<IPinVT>(self).Connect)(self.ptr(), receive_pin.ptr(), pcvoid_or_null(mt))
34 })
35 }
36
37 fn_com_interface_get! { ConnectedTo: IPinVT => IPin;
38 }
41
42 fn ConnectionMediaType(&self, amt: &mut AM_MEDIA_TYPE) -> HrResult<()> {
45 ok_to_hrresult(unsafe { (vt::<IPinVT>(self).ConnectionMediaType)(self.ptr(), pvoid(amt)) })
46 }
47
48 fn_com_noparm! { Disconnect: IPinVT;
49 }
52
53 fn_com_noparm! { EndFlush: IPinVT;
54 }
57
58 fn_com_noparm! { EndOfStream: IPinVT;
59 }
62
63 fn_com_interface_get! { EnumMediaTypes: IPinVT => IEnumMediaTypes;
64 }
67
68 fn NewSegment(&self, start: i64, stop: i64, rate: f64) -> HrResult<()> {
71 ok_to_hrresult(unsafe { (vt::<IPinVT>(self).NewSegment)(self.ptr(), start, stop, rate) })
72 }
73
74 #[must_use]
77 fn QueryAccept(&self, amt: &AM_MEDIA_TYPE) -> HrResult<bool> {
78 okfalse_to_hrresult(unsafe { (vt::<IPinVT>(self).QueryAccept)(self.ptr(), pcvoid(amt)) })
79 }
80
81 #[must_use]
84 fn QueryDirection(&self) -> HrResult<co::PIN_DIRECTION> {
85 let mut pin_dir = co::PIN_DIRECTION::INPUT;
86 ok_to_hrresult(unsafe {
87 (vt::<IPinVT>(self).QueryDirection)(self.ptr(), pvoid(&mut pin_dir))
88 })
89 .map(|_| pin_dir)
90 }
91
92 #[must_use]
95 fn QueryId(&self) -> HrResult<String> {
96 let mut pstr = std::ptr::null_mut::<u16>();
97 ok_to_hrresult(unsafe { (vt::<IPinVT>(self).QueryId)(self.ptr(), &mut pstr) })
98 .map(|_| htaskmem_ptr_to_str(pstr))
99 }
100
101 #[must_use]
104 fn QueryInternalConnections(&self) -> HrResult<Vec<IPin>> {
105 let mut count = 0u32;
106 if let Err(e) = ok_to_hrresult(unsafe {
107 (vt::<IPinVT>(self).QueryInternalConnections)(
108 self.ptr(),
109 std::ptr::null_mut(),
110 &mut count,
111 )
112 }) {
113 return Err(e);
114 }
115
116 let mut queried = vec![unsafe { IPin::null() }];
117 ok_to_hrresult(unsafe {
118 (vt::<IPinVT>(self).QueryInternalConnections)(
119 self.ptr(),
120 queried.as_mut_ptr() as _,
121 &mut count,
122 )
123 })
124 .map(|_| queried)
125 }
126
127 fn QueryPinInfo(&self, info: &mut PIN_INFO) -> HrResult<()> {
130 ok_to_hrresult(unsafe { (vt::<IPinVT>(self).QueryPinInfo)(self.ptr(), pvoid(info)) })
131 }
132
133 fn ReceiveConnection(&self, connector: &impl dshow_IPin, mt: &AM_MEDIA_TYPE) -> HrResult<()> {
136 ok_to_hrresult(unsafe {
137 (vt::<IPinVT>(self).ReceiveConnection)(self.ptr(), connector.ptr(), pcvoid(mt))
138 })
139 }
140}